package com.shop.shoppingmall.util;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.io.Writer;
import java.util.List;


/**
 * writeValue(File arg0, Object arg1)把arg1转成json序列，并保存到arg0文件中。
 * writeValue(OutputStream arg0, Object arg1)把arg1转成json序列，并保存到arg0输出流中。
 * writeValueAsBytes(Object arg0)把arg0转成json序列，并把结果输出成字节数组。
 * writeValueAsString(Object arg0)把arg0转成json序列，并把结果输出成字符串。
 * readValue(String json,Class cla)把json反序列化为实体类
 *
 * @JsonIgnore 此注解用于属性上，作用是进行JSON操作时忽略该属性。
   @JsonFormat 此注解用于属性上，作用是把Date类型直接转化为想要的格式，如@JsonFormat(pattern = "yyyy-MM-dd HH-mm-ss")。
   @JsonProperty 此注解用于属性上，作用是把该属性的名称序列化为另外一个名称，如把trueName属性序列化为name，@JsonProperty("name")。
 *
 */
public class Jackson {
	// ObjectMapper是JSON操作的核心，Jackson的所有JSON操作都是在ObjectMapper中实现。
	private static ObjectMapper om;

	static
	{
		om = new ObjectMapper();
		om.setDateFormat(new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
	}

	public static String toJson(Object src) {
		if (src == null) {
			return "{}";
		} else {
			try {
				return om.writeValueAsString(src);
			} catch (JsonProcessingException e) {
				return "{}";
			}
		}
	}

	public static Boolean toJson(Object src, Writer w) {
        if (src == null) {
        	return false;
        }
        else {
        	try {
        		om.writeValue(w, src);
        		return true;
			} catch (JsonProcessingException e) {
				return false;
			}
        	catch(Exception e){
        		return false;
        	}
        }
	}

	public static <T> T toObj(String jsonStr, Class<T> cla) throws JsonParseException, JsonMappingException, IOException
	{
		return om.readValue(jsonStr, cla);
	}

	public static <T> List<T> toObjList(String jsonStr, Class<T> cla) throws JsonParseException, JsonMappingException, IOException
	{
		List<T> t = om.readValue(
				jsonStr,
				om.getTypeFactory().constructParametricType(List.class, cla));
		return t;
	}

}
